﻿using System;

namespace Cemit.NetFramework
{
    public interface IMonoHandler
    {
        event Action OnUpdate;

        void Invoke(Action action);
        void InvokeAtNextFrame(Action action);
    }

    public static class MonoHandlerGenericExtension
    {
        /// <summary>
        /// 在Unity主线程的下一帧调用一个方法（仅在下一次Update执行一次）
        /// </summary>
        public static void InvokeAtNextFrame<T>(this IMonoHandler handler, Action<T> action, T arg) 
        {
            handler.InvokeAtNextFrame(() =>
            {
                action?.Invoke(arg);
            });
        }

        /// <summary>
        /// 在Unity主线程中调用一个方法（仅在Update执行一次）
        /// </summary>
        public static void Invoke<T>(this IMonoHandler handler, Action<T> action, T arg)
        {
            handler.Invoke(() =>
            {
                action?.Invoke(arg);
            });
        }
    }
}